package CapaDatos;

import CapaDatos.listas.ListaAcompanantes;
import java.util.List;

public class Reservacion
{
    private final int MAX_HUESPEDES;
    private String ID;
    private Cliente cliente;
    private Habitacion habitacion;
    private ListaAcompanantes acompanantes;
    private Fecha fechaInicio;
    private Fecha fechaFin;
    private Fecha fechaCompra;
    private float precioSubTotal;
    private float precioTotal;

    public Reservacion (String ID, Cliente cliente, Habitacion habitacion, List acompanantes, String fechaInicio, String fechaFin, String fechaCompra, float precioSubTotal, float precioTotal)
    {
        this.MAX_HUESPEDES  = habitacion.getCapacidad();
        this.ID             = ID;
        this.cliente        = cliente;
        this.habitacion     = habitacion;
        this.acompanantes   = new ListaAcompanantes (acompanantes);
        this.fechaInicio    = new Fecha(fechaInicio);
        this.fechaFin       = new Fecha(fechaFin);
        this.fechaCompra    = new Fecha(fechaCompra);
        this.precioSubTotal = precioSubTotal;
        this.precioTotal    = precioTotal;
    }

    public Reservacion (Cliente cliente, Habitacion habitacion, String fechaInicio, String fechaFin, String fechaCompra)
    {
        this.MAX_HUESPEDES  = habitacion.getCapacidad();
        this.cliente        = cliente;
        this.habitacion     = habitacion;
        this.fechaInicio    = new Fecha(fechaInicio);
        this.fechaFin       = new Fecha(fechaFin);
        this.fechaCompra    = new Fecha(fechaCompra);
        agregarAcompanante(cliente);
        this.calcularMonto();
    }

    // <editor-fold defaultstate="collapsed" desc="Getters y Setters">
    public int getPersonas() {
        return acompanantes.cantidad();
    }

    public String getID() {
        return this.ID;
    }

    public void setID (String ID) {
        this.ID = ID;
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public Habitacion getHabitacion() {
        return habitacion;
    }

    public void setHabitacion(Habitacion habitacion) {
        this.habitacion = habitacion;
    }

    public Fecha getFechaInicio() {
        return this.fechaInicio;
    }

    public Persona[] getAcompañantes() {
        return acompanantes.array();
    }

    public void setAcompañantes(ListaAcompanantes acompañantes) {
        this.acompanantes = acompañantes;
    }

    public void setFechaInicio (String fechaInicio) {
        this.fechaInicio = new Fecha(fechaInicio);
    }

    public Fecha getFechaFin() {
        return this.fechaFin;
    }

    public void setFechaFin (String fechaFin) {
        this.fechaFin = new Fecha(fechaFin);
    }

    public Fecha getFechaCompra() {
        return this.fechaCompra;
    }

    public void setFechaCompra (String fechaCompra) {
        this.fechaFin = new Fecha(fechaCompra);
    }

    public float getPrecioSubTotal() {
        return this.precioSubTotal;
    }

    public void setPrecioSubTotal (float precioSubTotal) {
        this.precioSubTotal = precioSubTotal;
    }

    public float getPrecioTotal() {
        return this.precioTotal;
    }

    public void setPrecioTotal (float precioTotal) {
        this.precioTotal = precioTotal;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="agregarAcompañante">
    public boolean agregarAcompanante (Persona acompanante) {
        int edad = calcularEdad(acompanante.getFechaNacimiento());

        if (acompanantes.cantidad() < MAX_HUESPEDES)
        {
            acompanantes.agregar(acompanante);

            if ((edad < 60) && (edad > 2))
                precioSubTotal += 2000;
            else
                precioSubTotal += 570;

            this.calcularMonto();
        }

        return false;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="actualizarPrecio">
    public void actualizarPrecio (float monto) {
        this.precioSubTotal += monto;

        if (cliente.isVIP())
            precioTotal = precioSubTotal * (4/5);
        else
            precioTotal = precioSubTotal;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="equals y hashCode">
    @Override
    public boolean equals(Object objeto) {
        Reservacion objetoReservacion;

        if (! (objeto instanceof Reservacion))
            return false;

        objetoReservacion = (Reservacion) objeto;

        if (this.ID.equals(objetoReservacion.getID()))
            return true;

        return false;
    }

    @Override
    public int hashCode() {
        int hash = 0;

        hash += (ID != null ? ID.hashCode() : 0);

        return hash;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Calcular Edad">
    private int calcularEdad (Fecha fechaNacimiento) {
        Fecha fechaActual = new Fecha();

        int edad = fechaActual.get(Fecha.YEAR) - fechaNacimiento.get(Fecha.YEAR);

        if (fechaNacimiento.get(Fecha.DAY_OF_YEAR) < fechaActual.get(Fecha.DAY_OF_YEAR))
            edad--;

        return edad;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Calcular Monto">
    private void calcularMonto() {
        this.precioTotal = this.precioSubTotal;
        if (cliente.isVIP())
            this.precioTotal *= 4/5;
    }
    // </editor-fold>
}

